package com.woniu.common;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.woniu.dto.BookConst;
import com.woniu.pojo.Book;
import com.woniu.pojo.BookType;
import com.woniu.redis.RedisConst;
import com.woniu.service.BookService;
import com.woniu.service.BookTypeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Set;

@Component
@Slf4j
public class BookInventoryTask {
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private BookService bookService;
    @Autowired
    private BookTypeService bookTypeService;



    /**
     * 指定定时任务
     *   更新热销榜和分类的redis中数据
     *
     * Scheduled注解作用如下：
     *   1、initialDelay：首次执行的延时时间，单位为毫秒ms，默认为0。
     *   2、fixedDelay：上一次开始执行时间点之后5秒再进入执行，无论任务执行多长时间
     *      ，下一次开始都从上一次完成时间开始计算。
     *   3、cron 表达式
     */
//    @Scheduled(initialDelay = 3000, fixedDelay = 5000)  该条为测试
    // 每天0点指定，更新库存
    @Scheduled(cron = "0 0 0 * * ?")
    public void updateHotSelling() {
        // 删除所有以 book:list 开头的key
        deleteKeys(RedisConst.BOOK_LIST + "*");
        // 重新查询热销榜数据到 redis
        bookService.findTopSales(BookConst.FIRST_PAGE, BookConst.PAGE_SIZE);
        // 查询所有分类，将分类首页更新到redis
        deleteKeys(RedisConst.BOOK_TYPE_LIST + "*");
        List<BookType> bookTypes = bookTypeService.findAll();
        bookTypes.forEach(bookType -> {
            bookService.lambdaQuery()
                    .eq(Book::getTypeId, bookType.getId())
                    .page(new Page<>(BookConst.FIRST_PAGE, BookConst.PAGE_SIZE));
        });
        log.info("更新热销榜和分类的redis中数据成功");
    }

    /**
     * 删除和服指定模式的key
     * */
    public void deleteKeys(String pattern) {
        // 获取符合该模式的key
        Set<String> keys = redisTemplate.keys(pattern);
        // 遍历删除这些key
        keys.forEach(key ->{
            redisTemplate.delete(key);
            log.info("删除key：{}", key);
        });
    }


}
